package com.example.lt.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.lt.config.QiNiuConfig;
import com.example.lt.context.LocalCache;
import com.example.lt.entity.File;
import com.example.lt.exception.BaseException;
import com.example.lt.exception.FileOperateException;
import com.example.lt.mapper.FileMapper;
import com.example.lt.service.FileService;
import com.example.lt.service.QiNiuFileService;
import com.qiniu.storage.model.FileInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.UUID;

/**
 * @Author 小涛Tao
 * @Date: 2024/08/05/11:11
 * version 1.0 注释：
 **/
@Service
@RequiredArgsConstructor
public class FileServiceImpl extends ServiceImpl<FileMapper, File> implements FileService {

    private final QiNiuFileService qiNiuFileService;

    /**
     * 在文件表中存储上传到 QiNiu 上的文件信息
     * @param fileKey
     * @param userId
     * @return
     */
    @Override
    public Long saveFile(String fileKey, Long userId) {

        // 判断文件是否在 QiNiu 上存在
        final FileInfo fileInfo = qiNiuFileService.getFileInfo(fileKey);
        if (fileInfo == null) throw new FileOperateException("文件参数不正确");

        // 创建文件对象封装文件信息
        String type = fileInfo.mimeType; // 获取文件的类型
        final File file = File.builder()
                .fileKey(fileKey)
                .format(type)
                .type(type.contains("video") ? "视频" : "图片")
                .userId(userId)
                .size(fileInfo.fsize)
                .build();

        save(file); // 保存文件信息

        return file.getId(); // 返回保存后生成的文件Id
    }

    /**
     * 根据视频id生成封面
     * @param fileId
     * @return
     */
    @Override
    public Long generatePhoto(Long fileId, Long userId) {
        // 生成封面的 fileKey
        // 这后面的 "?vframe/jpg/offset/1" 是对视频进行截图
        final String fileKey = getById(fileId).getFileKey() + "?vframe/jpg/offset/1";

        // 创建封面信息封装对象，并保存封面信息
        final File file = File.builder()
                .fileKey(fileKey)
                .userId(userId)
                .format("image/*")
                .type("图片")
                .build();
        save(file);

        return file.getId(); // 返回封面图片id
    }

    /**
     * 获取文件真实URL
     * @param fileId 文件id
     * @return
     */
    @Override
    public File getFileTrustUrl(Long fileId) {
        final File file = getById(fileId);
        if (ObjectUtils.isEmpty(file)) {
            throw new BaseException("未找到改文件");
        }

        final String str = UUID.randomUUID().toString();
        LocalCache.put(str, true);
        String url = QiNiuConfig.CNAME + "/" + file.getFileKey();

        // 因为有些视频的封面是由视频的截图生成的，这种封面的 fileKey 中会有？并带有参数，所以需要做一个判断
        if (url.contains("?")) {
            url = url+"&uuid="+str;
        } else {
            url = url+"?uuid="+str;
        }
        // 设置为资源的全路径url
        file.setFileKey(url);
        return file;
    }

}
